﻿2026-05-16T06:03:02.5949274Z ##[group]Run pnpm verify:phase-5
2026-05-16T06:03:02.5949608Z [36;1mpnpm verify:phase-5[0m
2026-05-16T06:03:02.5985185Z shell: /usr/bin/bash -e {0}
2026-05-16T06:03:02.5985454Z env:
2026-05-16T06:03:02.5985723Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-16T06:03:02.5986064Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-16T06:03:02.5986304Z   SKIP_TRACE_CHECK: 1
2026-05-16T06:03:02.5986541Z ##[endgroup]
2026-05-16T06:03:02.9011617Z 
2026-05-16T06:03:02.9012869Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-16T06:03:02.9013716Z > node scripts/verify-phase-5.mjs
2026-05-16T06:03:02.9014125Z 
2026-05-16T06:03:02.9336787Z 
2026-05-16T06:03:02.9337846Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-16T06:03:02.9338618Z >>> pnpm verify:phase-4
2026-05-16T06:03:03.2399484Z 
2026-05-16T06:03:03.2400555Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-16T06:03:03.2401434Z > node scripts/verify-phase-4.mjs
2026-05-16T06:03:03.2402098Z 
2026-05-16T06:03:03.2717474Z 
2026-05-16T06:03:03.2718464Z === Workspace: typecheck ===
2026-05-16T06:03:03.2719163Z >>> pnpm -r typecheck
2026-05-16T06:03:03.6060094Z Scope: 5 of 6 workspace projects
2026-05-16T06:03:03.6114979Z packages/db typecheck$ tsc --noEmit
2026-05-16T06:03:03.6124831Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T06:03:06.3693385Z packages/game-logic typecheck: Done
2026-05-16T06:03:06.3753006Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T06:03:08.2528989Z packages/db typecheck: Done
2026-05-16T06:03:09.7596192Z packages/protocol typecheck: Done
2026-05-16T06:03:09.7604582Z apps/client typecheck$ tsc --noEmit
2026-05-16T06:03:09.7607595Z apps/server typecheck$ tsc --noEmit
2026-05-16T06:03:21.8213003Z apps/client typecheck: Done
2026-05-16T06:03:22.4829797Z apps/server typecheck: Done
2026-05-16T06:03:22.4939582Z 
2026-05-16T06:03:22.4940500Z === Lint: protocol-sync ===
2026-05-16T06:03:22.4941196Z >>> pnpm lint:protocol-sync
2026-05-16T06:03:22.7924401Z 
2026-05-16T06:03:22.7925495Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-16T06:03:22.7926661Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-16T06:03:22.7927274Z 
2026-05-16T06:03:22.8265614Z lint-protocol-sync: OK
2026-05-16T06:03:22.8401285Z 
2026-05-16T06:03:22.8413017Z === Lint: game-logic-purity ===
2026-05-16T06:03:22.8413879Z >>> pnpm lint:game-logic-purity
2026-05-16T06:03:23.1410569Z 
2026-05-16T06:03:23.1411712Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-16T06:03:23.1413301Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-16T06:03:23.1413925Z 
2026-05-16T06:03:23.1753787Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-16T06:03:23.1889738Z 
2026-05-16T06:03:23.1890717Z === Lint: better-auth-schema-sync ===
2026-05-16T06:03:23.1891644Z >>> pnpm lint:better-auth-schema-sync
2026-05-16T06:03:23.4879871Z 
2026-05-16T06:03:23.4881045Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-16T06:03:23.4882729Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-16T06:03:23.4883449Z 
2026-05-16T06:03:24.9628389Z lint-better-auth-schema-sync: OK
2026-05-16T06:03:24.9767180Z 
2026-05-16T06:03:24.9767942Z === Lint: rate-limit-budgets ===
2026-05-16T06:03:24.9768689Z >>> pnpm lint:rate-limit-budgets
2026-05-16T06:03:25.2755167Z 
2026-05-16T06:03:25.2756425Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-16T06:03:25.2757546Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-16T06:03:25.2758068Z 
2026-05-16T06:03:25.3119632Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-16T06:03:25.3255913Z 
2026-05-16T06:03:25.3256946Z === Lint: no-clipboard-rce ===
2026-05-16T06:03:25.3257736Z >>> pnpm lint:no-clipboard-rce
2026-05-16T06:03:25.6469606Z 
2026-05-16T06:03:25.6470809Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-16T06:03:25.6472083Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-16T06:03:25.6472625Z 
2026-05-16T06:03:25.6891505Z lint-no-clipboard-rce: OK (22 file(s) clean)
2026-05-16T06:03:25.7028718Z 
2026-05-16T06:03:25.7029709Z === Lint: room-layout ===
2026-05-16T06:03:25.7030433Z >>> pnpm lint:room-layout
2026-05-16T06:03:26.0025288Z 
2026-05-16T06:03:26.0026387Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-16T06:03:26.0027394Z > node tools/scripts/lint-room-layout.mjs
2026-05-16T06:03:26.0027934Z 
2026-05-16T06:03:26.0451023Z lint-room-layout: OK
2026-05-16T06:03:26.0591601Z 
2026-05-16T06:03:26.0592722Z === ADR 0004 lint ===
2026-05-16T06:03:26.0593426Z >>> pnpm lint:adr:0004
2026-05-16T06:03:26.3538903Z 
2026-05-16T06:03:26.3539957Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-16T06:03:26.3541363Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-16T06:03:26.3542367Z 
2026-05-16T06:03:26.3882134Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T06:03:26.4008610Z 
2026-05-16T06:03:26.4009378Z === Drizzle: emit-check ===
2026-05-16T06:03:26.4010116Z >>> pnpm db:emit-check
2026-05-16T06:03:26.6946959Z 
2026-05-16T06:03:26.6947819Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-16T06:03:26.6950270Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-16T06:03:26.6952678Z 
2026-05-16T06:03:27.1422920Z No config path provided, using default 'drizzle.config.ts'
2026-05-16T06:03:27.1425559Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-16T06:03:27.5377361Z 8 tables
2026-05-16T06:03:27.5377864Z accounts 8 columns 1 indexes 0 fks
2026-05-16T06:03:27.5378410Z audit_log 6 columns 0 indexes 2 fks
2026-05-16T06:03:27.5378946Z characters 9 columns 0 indexes 1 fks
2026-05-16T06:03:27.5379460Z inventory_items 4 columns 0 indexes 1 fks
2026-05-16T06:03:27.5380089Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-16T06:03:27.5380762Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-16T06:03:27.5381370Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-16T06:03:27.5382147Z sessions 5 columns 0 indexes 1 fks
2026-05-16T06:03:27.5382423Z 
2026-05-16T06:03:27.5383428Z No schema changes, nothing to migrate 😴
2026-05-16T06:03:27.6557791Z 
2026-05-16T06:03:27.6558607Z === Drizzle: schema-sync ===
2026-05-16T06:03:27.6559303Z >>> pnpm lint:schema-sync
2026-05-16T06:03:27.9759839Z 
2026-05-16T06:03:27.9760778Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-16T06:03:27.9764396Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-16T06:03:27.9766875Z 
2026-05-16T06:03:28.0047202Z OK
2026-05-16T06:03:28.0184704Z 
2026-05-16T06:03:28.0185482Z === Drizzle: source-comments ===
2026-05-16T06:03:28.0186256Z >>> pnpm lint:source-comments
2026-05-16T06:03:28.3140445Z 
2026-05-16T06:03:28.3141560Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-16T06:03:28.3143060Z > pnpm -C packages/db run lint:source-comments
2026-05-16T06:03:28.3143712Z 
2026-05-16T06:03:28.6180619Z 
2026-05-16T06:03:28.6182139Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-16T06:03:28.6183416Z > node scripts/check-source-comments.mjs
2026-05-16T06:03:28.6184063Z 
2026-05-16T06:03:28.6508994Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-16T06:03:28.6757985Z 
2026-05-16T06:03:28.6758863Z === Workspace: test ===
2026-05-16T06:03:28.6759547Z >>> pnpm -r test
2026-05-16T06:03:28.9881287Z Scope: 5 of 6 workspace projects
2026-05-16T06:03:28.9936848Z packages/db test$ vitest run
2026-05-16T06:03:28.9945822Z packages/game-logic test$ vitest run
2026-05-16T06:03:29.5024416Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T06:03:29.5113917Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T06:03:29.9519361Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T06:03:30.2069985Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T06:03:30.4420717Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T06:03:30.4724148Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T06:03:30.6780068Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T06:03:30.8995408Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:03:31.1234073Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:31.3140637Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:03:31.3594375Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:03:31.5463172Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:03:31.5561599Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T06:03:31.5572870Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T06:03:31.5603094Z packages/db test: [2m   Start at [22m 06:03:29
2026-05-16T06:03:31.5604937Z packages/db test: [2m   Duration [22m 2.05s[2m (transform 192ms, setup 0ms, import 1.42s, tests 31ms, environment 1ms)[22m
2026-05-16T06:03:31.5887898Z packages/db test: Done
2026-05-16T06:03:31.5910483Z packages/protocol test$ vitest run
2026-05-16T06:03:31.5979081Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:31.8423970Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:32.0574417Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:32.1354299Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T06:03:32.2914709Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:03:32.5469706Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T06:03:32.6017434Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:32.6093593Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T06:03:32.6133791Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-16T06:03:32.6160022Z packages/game-logic test: [2m   Start at [22m 06:03:29
2026-05-16T06:03:32.6179466Z packages/game-logic test: [2m   Duration [22m 3.08s[2m (transform 297ms, setup 0ms, import 538ms, tests 100ms, environment 2ms)[22m
2026-05-16T06:03:32.6460617Z packages/game-logic test: Done
2026-05-16T06:03:32.7566103Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:03:32.9305721Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:03:33.0838669Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:33.0871394Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T06:03:33.0873525Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T06:03:33.0874823Z packages/protocol test: [2m   Start at [22m 06:03:32
2026-05-16T06:03:33.0876404Z packages/protocol test: [2m   Duration [22m 942ms[2m (transform 126ms, setup 0ms, import 271ms, tests 40ms, environment 1ms)[22m
2026-05-16T06:03:33.1213323Z packages/protocol test: Done
2026-05-16T06:03:33.1218502Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T06:03:33.1220806Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T06:03:33.6461199Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T06:03:33.7324065Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T06:03:34.6133671Z apps/server test: {"level":30,"time":1778911414607,"pid":4817,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T06:03:34.6165306Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 684[2mms[22m[39m
2026-05-16T06:03:34.6213647Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 560[2mms[22m[39m
2026-05-16T06:03:35.0919688Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 184[2mms[22m[39m
2026-05-16T06:03:35.7455729Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T06:03:35.7478560Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T06:03:35.8297794Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 238[2mms[22m[39m
2026-05-16T06:03:36.1094933Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T06:03:36.1123868Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-84Hfsf/rebno.db
2026-05-16T06:03:36.1163289Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:03:36.1182583Z apps/server test: [run-migrations] OK
2026-05-16T06:03:36.1327588Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T06:03:36.1353212Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-obrFl6/rebno.db
2026-05-16T06:03:36.1368404Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:03:36.1371680Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T06:03:36.1376184Z apps/server test: [run-migrations] OK
2026-05-16T06:03:36.1423779Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T06:03:36.1426277Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-XC3R9F/rebno.db
2026-05-16T06:03:36.1433595Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:03:36.1436947Z apps/server test: [run-migrations] OK
2026-05-16T06:03:36.1473818Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T06:03:36.1475965Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-XC3R9F/rebno.db
2026-05-16T06:03:36.1480110Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:03:36.1481295Z apps/server test: [run-migrations] OK
2026-05-16T06:03:36.1502548Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-16T06:03:37.1060756Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 95[2mms[22m[39m
2026-05-16T06:03:37.1840926Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 42[2mms[22m[39m
2026-05-16T06:03:37.4631157Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T06:03:37.7293986Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 37[2mms[22m[39m
2026-05-16T06:03:38.0155267Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-16T06:03:38.2808403Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 123[2mms[22m[39m
2026-05-16T06:03:38.3136644Z apps/server test: {"level":40,"time":1778911418304,"pid":4945,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:03:38.3181153Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T06:03:38.3223191Z apps/server test: {"level":40,"time":1778911418309,"pid":4945,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:03:38.3230936Z apps/server test: {"level":40,"time":1778911418310,"pid":4945,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:03:38.5578660Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T06:03:38.8166585Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:03:39.5672449Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 127[2mms[22m[39m
2026-05-16T06:03:39.5703479Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T06:03:39.5723561Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-16T06:03:39.5762506Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T06:03:40.2689033Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:40.4958026Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:40.5026396Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T06:03:40.5063079Z apps/server test: [2m      Tests [22m [1m[32m71 passed[39m[22m[90m (71)[39m
2026-05-16T06:03:40.5109710Z apps/server test: [2m   Start at [22m 06:03:33
2026-05-16T06:03:40.5136372Z apps/server test: [2m   Duration [22m 6.85s[2m (transform 540ms, setup 0ms, import 3.26s, tests 1.10s, environment 2ms)[22m
2026-05-16T06:03:40.5565053Z apps/server test: Done
2026-05-16T06:03:40.6782897Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-16T06:03:41.4112508Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-16T06:03:42.1396700Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-16T06:03:42.8400607Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 39[2mms[22m[39m
2026-05-16T06:03:43.5326276Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-16T06:03:44.2347514Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T06:03:44.9252299Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T06:03:45.6358073Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T06:03:46.3276589Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T06:03:47.0492750Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T06:03:47.7394449Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T06:03:48.4077720Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:03:49.0809651Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:03:49.7446178Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:50.4046135Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:51.0703535Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:51.7455776Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:52.4194629Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:03:53.0740245Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:53.7324044Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:54.3928231Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:55.0522431Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:03:55.7179901Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:03:56.3902292Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:03:57.0460145Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:03:57.7102034Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:03:58.3676991Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-16T06:03:58.3919220Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T06:03:58.3928306Z apps/client test: [2m      Tests [22m [1m[32m216 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (220)[39m
2026-05-16T06:03:58.3965778Z apps/client test: [2m   Start at [22m 06:03:33
2026-05-16T06:03:58.3967301Z apps/client test: [2m   Duration [22m 24.66s[2m (transform 884ms, setup 62ms, collect 1.54s, tests 1.05s, environment 14.50s, prepare 2.67s)[22m
2026-05-16T06:03:58.5270026Z apps/client test: Done
2026-05-16T06:03:58.5347926Z 
2026-05-16T06:03:58.5348749Z verify-phase-4: OK (12 steps green)
2026-05-16T06:03:58.5478850Z 
2026-05-16T06:03:58.5479700Z === Workspace: typecheck ===
2026-05-16T06:03:58.5480405Z >>> pnpm -r typecheck
2026-05-16T06:03:58.8439155Z Scope: 5 of 6 workspace projects
2026-05-16T06:03:58.8491158Z packages/db typecheck$ tsc --noEmit
2026-05-16T06:03:58.8499640Z packages/game-logic typecheck$ tsc --noEmit
2026-05-16T06:04:01.4553065Z packages/game-logic typecheck: Done
2026-05-16T06:04:01.4579177Z packages/protocol typecheck$ tsc --noEmit
2026-05-16T06:04:03.2563452Z packages/db typecheck: Done
2026-05-16T06:04:04.7551068Z packages/protocol typecheck: Done
2026-05-16T06:04:04.7558849Z apps/client typecheck$ tsc --noEmit
2026-05-16T06:04:04.7562148Z apps/server typecheck$ tsc --noEmit
2026-05-16T06:04:16.7493240Z apps/client typecheck: Done
2026-05-16T06:04:17.0908258Z apps/server typecheck: Done
2026-05-16T06:04:17.1019683Z 
2026-05-16T06:04:17.1020452Z === Lint: deploy-stack ===
2026-05-16T06:04:17.1021123Z >>> pnpm lint:deploy-stack
2026-05-16T06:04:17.3909603Z 
2026-05-16T06:04:17.3910516Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-16T06:04:17.3911261Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-16T06:04:17.3911595Z 
2026-05-16T06:04:17.4292591Z lint-deploy-stack: OK
2026-05-16T06:04:17.4421381Z 
2026-05-16T06:04:17.4422301Z === Lint: deploy-stack test ===
2026-05-16T06:04:17.4423478Z >>> pnpm lint:deploy-stack:test
2026-05-16T06:04:17.7355578Z 
2026-05-16T06:04:17.7356710Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-16T06:04:17.7358214Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-16T06:04:17.7359286Z 
2026-05-16T06:04:17.8037781Z PASS: lint-deploy-stack green
2026-05-16T06:04:17.8252633Z 
2026-05-16T06:04:17.8254851Z === ADR 0005 lint ===
2026-05-16T06:04:17.8255517Z >>> pnpm lint:adr:0005
2026-05-16T06:04:18.1315061Z 
2026-05-16T06:04:18.1316212Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-16T06:04:18.1317934Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-16T06:04:18.1318990Z 
2026-05-16T06:04:18.1633820Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T06:04:18.1767418Z 
2026-05-16T06:04:18.1768242Z === ADR 0006 lint ===
2026-05-16T06:04:18.1769296Z >>> pnpm lint:adr:0006
2026-05-16T06:04:18.4671037Z 
2026-05-16T06:04:18.4672242Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-16T06:04:18.4675295Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-16T06:04:18.4675958Z 
2026-05-16T06:04:18.4993088Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-16T06:04:18.5115887Z 
2026-05-16T06:04:18.5116621Z === Workspace: test ===
2026-05-16T06:04:18.5117606Z >>> pnpm -r test
2026-05-16T06:04:18.8049131Z Scope: 5 of 6 workspace projects
2026-05-16T06:04:18.8101401Z packages/db test$ vitest run
2026-05-16T06:04:18.8110698Z packages/game-logic test$ vitest run
2026-05-16T06:04:19.3277586Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-16T06:04:19.3280287Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-16T06:04:19.7385930Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T06:04:19.9704809Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T06:04:20.2191446Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-16T06:04:20.2228699Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-16T06:04:20.4475263Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:20.6574226Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:20.8553849Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:21.0652011Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:04:21.0863533Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:04:21.2866216Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:21.2960789Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:04:21.2963064Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-16T06:04:21.2994506Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-16T06:04:21.3054938Z packages/db test: [2m   Start at [22m 06:04:19
2026-05-16T06:04:21.3081593Z packages/db test: [2m   Duration [22m 1.99s[2m (transform 153ms, setup 0ms, import 1.37s, tests 27ms, environment 1ms)[22m
2026-05-16T06:04:21.3272562Z packages/db test: Done
2026-05-16T06:04:21.3292685Z packages/protocol test$ vitest run
2026-05-16T06:04:21.5029044Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:21.7195030Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:21.8675369Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-16T06:04:21.9337008Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:22.1637959Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:04:22.1718503Z packages/game-logic test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T06:04:22.1833398Z packages/game-logic test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-16T06:04:22.1852644Z packages/game-logic test: [2m   Start at [22m 06:04:19
2026-05-16T06:04:22.1912736Z packages/game-logic test: [2m   Duration [22m 2.86s[2m (transform 272ms, setup 0ms, import 499ms, tests 101ms, environment 2ms)[22m
2026-05-16T06:04:22.2437734Z packages/game-logic test: Done
2026-05-16T06:04:22.2813800Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T06:04:22.4478863Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:04:22.6106448Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:22.7641719Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:22.7678020Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-16T06:04:22.7696882Z packages/protocol test: [2m      Tests [22m [1m[32m36 passed[39m[22m[90m (36)[39m
2026-05-16T06:04:22.7702237Z packages/protocol test: [2m   Start at [22m 06:04:21
2026-05-16T06:04:22.7703878Z packages/protocol test: [2m   Duration [22m 890ms[2m (transform 151ms, setup 0ms, import 278ms, tests 35ms, environment 0ms)[22m
2026-05-16T06:04:22.8039265Z packages/protocol test: Done
2026-05-16T06:04:22.8045131Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-16T06:04:22.8047831Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-16T06:04:23.3539263Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-16T06:04:23.4224041Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-16T06:04:24.3214002Z apps/server test: {"level":30,"time":1778911464313,"pid":6050,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-16T06:04:24.3227033Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 668[2mms[22m[39m
2026-05-16T06:04:24.3243634Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 574[2mms[22m[39m
2026-05-16T06:04:24.7964250Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-16T06:04:25.4428851Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-16T06:04:25.4463711Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-16T06:04:25.5464321Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 248[2mms[22m[39m
2026-05-16T06:04:25.7694243Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-16T06:04:25.7716082Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-wPMNxr/rebno.db
2026-05-16T06:04:25.7742931Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:04:25.7753250Z apps/server test: [run-migrations] OK
2026-05-16T06:04:25.7820694Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-16T06:04:25.7842473Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-WBTksM/rebno.db
2026-05-16T06:04:25.7843897Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:04:25.7883469Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-16T06:04:25.7922109Z apps/server test: [run-migrations] OK
2026-05-16T06:04:25.7927219Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T06:04:25.7952194Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-KSlM0I/rebno.db
2026-05-16T06:04:25.7953894Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:04:25.7970725Z apps/server test: [run-migrations] OK
2026-05-16T06:04:25.7973029Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-16T06:04:25.7974994Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-KSlM0I/rebno.db
2026-05-16T06:04:25.7982579Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-16T06:04:25.7983725Z apps/server test: [run-migrations] OK
2026-05-16T06:04:25.7985441Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 52[2mms[22m[39m
2026-05-16T06:04:26.6830574Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 114[2mms[22m[39m
2026-05-16T06:04:26.8555308Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-16T06:04:27.1367129Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-16T06:04:27.3753913Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T06:04:27.6605153Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-16T06:04:27.8561507Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 131[2mms[22m[39m
2026-05-16T06:04:27.9624275Z apps/server test: {"level":40,"time":1778911467926,"pid":6175,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:04:27.9633483Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-16T06:04:27.9924004Z apps/server test: {"level":40,"time":1778911467930,"pid":6175,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:04:28.0275666Z apps/server test: {"level":40,"time":1778911467931,"pid":6175,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-16T06:04:28.2274588Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-16T06:04:28.4269898Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-16T06:04:29.1733530Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-16T06:04:29.1974610Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-16T06:04:29.1993053Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-16T06:04:29.2094007Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 96[2mms[22m[39m
2026-05-16T06:04:29.8945623Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:30.1275857Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:30.1304155Z apps/server test: [2m Test Files [22m [1m[32m12 passed[39m[22m[90m (12)[39m
2026-05-16T06:04:30.1305838Z apps/server test: [2m      Tests [22m [1m[32m71 passed[39m[22m[90m (71)[39m
2026-05-16T06:04:30.1307452Z apps/server test: [2m   Start at [22m 06:04:23
2026-05-16T06:04:30.1309237Z apps/server test: [2m   Duration [22m 6.75s[2m (transform 567ms, setup 0ms, import 3.27s, tests 1.03s, environment 2ms)[22m
2026-05-16T06:04:30.1711441Z apps/server test: Done
2026-05-16T06:04:30.2651723Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-16T06:04:30.9834443Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-16T06:04:31.7068743Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-16T06:04:32.4102929Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-16T06:04:33.0947151Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-16T06:04:33.7836267Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-16T06:04:34.4554667Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-16T06:04:35.1574697Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-16T06:04:35.8418350Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-16T06:04:36.5793888Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T06:04:37.2500213Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-16T06:04:37.9128454Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-16T06:04:38.5871184Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-16T06:04:39.2420445Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:39.8986163Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:40.5792657Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:41.2467144Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:41.9263067Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-16T06:04:42.5744831Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:43.2445280Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:43.9097186Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:44.5569755Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-16T06:04:45.2077544Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:04:45.8727220Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:04:46.5302470Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:04:47.1799528Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-16T06:04:47.8564711Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-16T06:04:47.8892902Z apps/client test: [2m Test Files [22m [1m[32m31 passed[39m[22m[90m (31)[39m
2026-05-16T06:04:47.8894765Z apps/client test: [2m      Tests [22m [1m[32m216 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (220)[39m
2026-05-16T06:04:47.8897493Z apps/client test: [2m   Start at [22m 06:04:23
2026-05-16T06:04:47.8898936Z apps/client test: [2m   Duration [22m 24.46s[2m (transform 884ms, setup 65ms, collect 1.55s, tests 1.05s, environment 14.43s, prepare 2.54s)[22m
2026-05-16T06:04:48.0172684Z apps/client test: Done
2026-05-16T06:04:48.0282787Z 
2026-05-16T06:04:48.0284438Z verify-phase-5: OK (7 steps green)
